from mcp.server.fastmcp import FastMCP

# 创建MCP服务实例
mcp = FastMCP("Math Calculation Service")

@mcp.tool()
def add(a: float, b: float) -> float:
    """加法运算
    
    Args:
        a: 第一个加数
        b: 第二个加数
        
    Returns:
        两数之和
    """
    return a + b

@mcp.tool()
def subtract(a: float, b: float) -> float:
    """减法运算
    
    Args:
        a: 被减数
        b: 减数
        
    Returns:
        两数之差
    """
    return a - b

@mcp.tool()
def multiply(a: float, b: float) -> float:
    """乘法运算
    
    Args:
        a: 第一个因数
        b: 第二个因数
        
    Returns:
        两数之积
    """
    return a * b

@mcp.tool()
def divide(a: float, b: float) -> str:
    """除法运算
    
    Args:
        a: 被除数
        b: 除数
        
    Returns:
        两数之商或错误信息
    """
    try:
        if b == 0:
            return "错误: 除数不能为零"
        return a / b
    except Exception as e:
        return f"计算错误: {str(e)}"

@mcp.tool()
def power(base: float, exponent: float) -> float:
    """乘方运算
    
    Args:
        base: 底数
        exponent: 指数
        
    Returns:
        乘方结果
    """
    return base ** exponent

@mcp.tool()
def is_prime(num: int) -> bool:
    """判断是否为质数
    
    Args:
        num: 要判断的数字
        
    Returns:
        是否为质数
    """
    if num <= 1:
        return False
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return False
    return True

@mcp.tool()
def sqrt(num: float) -> float:
    """开方运算
    
    Args:
        num: 要开方的数字
        
    Returns:
        平方根结果
    """
    if num < 0:
        raise ValueError("负数不能开平方")
    return num ** 0.5

@mcp.tool()
def prime_factors(num: int) -> list:
    """分解质因子
    
    Args:
        num: 要分解的数字
        
    Returns:
        质因子列表
    """
    if num <= 1:
        return []
    factors = []
    temp = num
    i = 2
    while i * i <= temp:
        if temp % i == 0:
            factors.append(i)
            temp = temp // i
        else:
            i += 1
    if temp > 1:
        factors.append(temp)
    return factors

@mcp.tool()
def round_number(num: float, digits: int = 0) -> float:
    """四舍五入运算
    
    Args:
        num: 要四舍五入的数字
        digits: 保留小数位数
        
    Returns:
        四舍五入后的结果
    """
    return round(num, digits)

if __name__ == "__main__":
    mcp.run()